#include "widget.h"
#include "ui_widget.h"
#include "QDebug"
#include "cmath"
// 图片加载相关
#include "QDir"
// 时间相关
#include "QDateTime"
#include "QElapsedTimer"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);  

    // icon图
    this->setWindowIcon(QIcon("logo.ico"));

    // 显示分压图
    QDir currentDir = QDir::currentPath();
    // qDebug() << currentDir;

    QString imagePath = "index.png"; // 图片文件路径

    // 创建 QImage 对象，从文件读取图像数据
    QImage image(imagePath);
    if (image.isNull()) {
        qDebug() << "Failed to load image from" << imagePath;
        return;
    }

    // 将图像插入到文本编辑器中
    QTextCursor cursor = ui->textEdit->textCursor();
    cursor.insertImage(image);
    ui->textEdit->setTextCursor(cursor);
}

Widget::~Widget()
{
    delete ui;
}


// 计算事件
void Widget::on_CompBut_clicked()
{
    // 结果计数
    qint64 andNumCount = 0;
    // 获取开始时间
    QElapsedTimer timer;
    timer.start();

    // 清空面板
    // ui -> CompTextEdit ->clear();
    // 连续字符串
    QString CompTextList = "";
    // 获取控件数据
    QString strVref = ui -> VrefLine ->text();
    QString strVout = ui -> VoutLine ->text();
    QString strResErr = ui -> ResErrBox ->currentText();
    QString strVouErr = ui -> VouErrBox ->currentText();
    // 打印数据
    // qDebug() << "Vref:" + strVref;
    // qDebug() << "Vout:" + strVout;
    // 设置控件数据
    // CompTextList += (numVref + "\n");
    float numR1_Base = 0;
    uint16_t numR1_Base_index = 1;
    float numR1 = 1.0;
    // float numR2_Base = 0;
    // uint16_t numR2_Base_index = 1;
    double numR2 = 0.0;
    float numVref = strVref.toFloat();
    float numVout = strVout.toFloat();
    float numErr = 0;
    float numResErr = strResErr.replace('%', "").toInt()*0.01;
    float numVouErr = strVouErr.replace('%', "").toInt()*0.01;
    // qDebug()<<numResErr<<numVouErr;
    // 算法推演
    double numR2_up = 0;
    double numR2_down = 0;
    // E24电阻阻值比例
    float NumResPro[] = {
        0,1,1.1,1.2,1.3,1.5,1.6,1.8,2,2.2,2.4,2.7,
        3,3.3,3.6,3.9,4.3,4.7,5.1,5.6,6.2,6.8,7.5,8.2,9.1
    };
    // 字符串处理
    QString tempStr = "";
    char buffer[100];
    // 穷举计算 精度步进0.1
    // Vout = Vref((R1+R2)/R1) 变式 R2 = ((Vo/Vr)-1)*R1)
    // 误差率计算
    for (numR1_Base = 1;numR1 < 1000;) {
        // R2推演
        // R1计算值演算
        numR1 = numR1_Base * NumResPro[numR1_Base_index];
        numR1_Base_index++;
        if(numR1_Base_index >= 24)
        {
            numR1_Base_index = 1;
            numR1_Base *= 10;
        }
        // R2反推算(理想点演算)
        // numR2 = ((numVout / numVref)-1)*numR1;
        // R2反推算(理想点输出误差下限点)
        numR2_down = ((numVout*(1 - numVouErr) / numVref)-1)*numR1;
        numR2_up = (((numVout*(1 + numVouErr) / numVref)-1)*numR1)+1;
        numR2 = (int) numR2_down;

        // 验证中R2的阻值成线性增长,输出成线性增长,误差相反
        /*
        qDebug()<<"阻值验证："<<numR2_down<<numR2_up;
        qDebug()<<"输出验证："<<numVref*((numR1+numR2_down)/numR1)<<numVref*((numR1+numR2_up)/numR1);
        qDebug()<<"误差验证："<<numVout - numVref*((numR1+numR2_down)/numR1)<<numVout - numVref*((numR1+numR2_up)/numR1)<<endl;
        continue;
        */
        for (;numR2 <= numR2_up;)
        {
            // R2穷举推算
            // qDebug()<<"R2:"<<numR2;
            // Err验证
            numErr = numVref*((numR1+numR2)/numR1);
            numErr = numVout - numErr;
            // qDebug() << "Err:"<<numVout*0.1<<fabs(numErr)<<numErr;

            // R2的独立步进量
            if(numR2 < pow(10,3)) {  numR2++; }
            else if(numR2 < pow(10,6)) {  numR2+=pow(10,2); }
            else if(numR2 < pow(10,9)) {  numR2+=pow(10,5); }

            // 输出误差控制
            if(numVout*numVouErr < fabs(numErr)) continue;
            // 不允许R2负值
            if(numR2 < 0) continue;

            // 符合结果累加
            andNumCount++;

            // 符合的显示输出
            std::sprintf(buffer,"R1=%.1f, R2=%.1f, Err=%.2f \n",numR1,numR2,numErr);
            tempStr = QString::fromLocal8Bit(buffer);
            CompTextList += (tempStr);
            ui -> CompTextEdit ->setText(CompTextList);  
        }
    }
    // 空结果
    if(CompTextList == "")
    {
        CompTextList = "查无结果...";
        ui -> CompTextEdit ->setText(CompTextList);
    }

    // 耗时统计
    qint64 elapsedTime = timer.elapsed();
    ui -> useTime -> setText(QString::number(elapsedTime * 0.001)+' '+'S');
    // 更新时间
    QTime currentTime = QTime::currentTime();
    QString StrTimehour = QString::number(currentTime.hour());
    QString StrTimeminute = QString::number(currentTime.minute());
    QString StrTimesecond = QString::number(currentTime.second());
    ui -> nowTime -> setText(((StrTimehour.length())<2?'0'+StrTimehour:StrTimehour)+':'+((StrTimeminute.length())<2?'0'+StrTimeminute:StrTimeminute)+':'+((StrTimesecond.length())<2?'0'+StrTimesecond:StrTimesecond));
    // 结果统计
    ui -> andNum -> setText(QString::number(andNumCount));

}
